package financeiro.manager;

import geral.manager.GenericManager;
import geral.manager.UtilManager;
import geral.util.FacesUtil;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.primefaces.event.SelectEvent;

import aspecto.annotation.Permissao;
import br.com.sgc.entities.financeiro.Caixa;
import br.com.sgc.entities.financeiro.Conta;
import br.com.sgc.exception.ValidacaoException;
import br.com.sgc.permissao.Role;
import br.com.sgc.session.CaixaSession;
import br.com.sgc.session.ContaSession;
import br.com.sgc.session.ContasPagarSession;
import br.com.sgc.session.ContasReceberSession;

@Named
@ConversationScoped
public class FluxoCaixaManager extends GenericManager implements Serializable {

	private static final long serialVersionUID = 1162181092252617106L;
	
	@EJB private ContaSession contaSession;
	
	@EJB private ContasReceberSession contasReceberSession;
	
	@EJB private ContasPagarSession contasPagarSession;
	
	@EJB private CaixaSession caixaSession;
	
	@Inject private UtilManager utilManager;
	
	private BigDecimal totalSaida;
	
	private BigDecimal totalEntrada;
	
	private BigDecimal saldoAtual;
	
	private Caixa caixaAnterior = new Caixa();
	
	private Caixa caixa = new Caixa();
	
	private List<Conta> contas = new ArrayList<Conta>();
	
	private Date dataCaixa = new Date();
	
	
	@Permissao(role = Role.Sistema_Financeiro_Fluxo_Caixa_Salvar)
	public void prepareSave(){
		caixa = caixaSession.findByDate(utilManager.getSegurancaManager().getUsuarioLogado().getClinica(), dataCaixa);
		if(caixa == null){
			caixa = new Caixa();
			caixa.setClinica(utilManager.getSegurancaManager().getUsuarioLogado().getClinica());
			caixa.setDataCaixa(new Date());
		}
		
		caixa.setSaldoAnterior(caixaAnterior.getSaldoAtual());
		caixa.setSaldoAtual(saldoAtual);
		caixa.setFechado(true);
	}
	
	@Permissao(role = Role.Sistema_Financeiro_Fluxo_Caixa_Salvar)
	public void save(){
		try {
			caixaSession.save(caixa);
			FacesUtil.mensInfo("Caixa Fechado com Sucesso.");
		} catch (ValidacaoException e) {
			e.printStackTrace();
			FacesUtil.mensErro(e.getMessage());
		}
		
	}
	
	@Permissao(role = Role.Sistema_Financeiro_Fluxo_Caixa_Salvar)
	public void update(){
		try {
			caixaSession.update(caixa);
			FacesUtil.mensInfo("Caixa Fechado com Sucesso.");
		} catch (ValidacaoException e) {
			e.printStackTrace();
			FacesUtil.mensErro(e.getMessage());
		}
		
	}
	
	@Permissao(role = Role.Sistema_Financeiro_Fluxo_Caixa_Listar)
	public String showFluxoCaixa(){
		contas = contaSession.findContasPorData(dataCaixa, utilManager.getSegurancaManager().getUsuarioLogado().getClinica());
		totalSaida = contasPagarSession.findTotalContasPorData(dataCaixa, utilManager.getSegurancaManager().getUsuarioLogado().getClinica());
		totalEntrada = contasReceberSession.findTotalContasPorData(dataCaixa, utilManager.getSegurancaManager().getUsuarioLogado().getClinica());
		caixaAnterior = caixaSession.findSaldoAnterior(utilManager.getSegurancaManager().getUsuarioLogado().getClinica(), dataCaixa);
		caixa = caixaSession.findByDate(utilManager.getSegurancaManager().getUsuarioLogado().getClinica(), dataCaixa);
		if(caixa == null){
			caixa = new Caixa();
			
		}
		
		if(caixaAnterior == null){
			caixaAnterior = new Caixa();
		}
		if(totalSaida == null){
			totalSaida = new BigDecimal(0.0);
		}
		if(totalEntrada == null){
			totalEntrada = new BigDecimal(0.0);
		}
		saldoAtual = caixaAnterior.getSaldoAtual().add(totalEntrada).subtract(totalSaida);
		
		return "fluxoCaixa";
	}
	
	@Permissao(role = Role.Sistema_Financeiro_Fluxo_Caixa_Listar)
	public void showCaixa(SelectEvent date) {
		dataCaixa = (Date)date.getObject();
		showFluxoCaixa();
	}
	
	@Permissao(role = Role.Sistema_Financeiro_Fluxo_Caixa_Reabrir)
	public void reabrirCaixa(){
		try {
			caixa.setFechado(false);
			caixaSession.update(caixa);
			FacesUtil.mensInfo("Caixa Reaberto com Sucesso");
		} catch (ValidacaoException e) {
			e.printStackTrace();
			FacesUtil.mensErro(e.getMessage());
		}
	}

	public List<Conta> getContas() {
		return contas;
	}

	public void setContas(List<Conta> contas) {
		this.contas = contas;
	}

	public Date getDataCaixa() {
		return dataCaixa;
	}

	public void setDataCaixa(Date dataCaixa) {
		this.dataCaixa = dataCaixa;
	}

	public BigDecimal getTotalSaida() {
		return totalSaida;
	}

	public void setTotalSaida(BigDecimal totalSaida) {
		this.totalSaida = totalSaida;
	}

	public BigDecimal getTotalEntrada() {
		return totalEntrada;
	}

	public void setTotalEntrada(BigDecimal totalEntrada) {
		this.totalEntrada = totalEntrada;
	}

	public Caixa getCaixaAnterior() {
		return caixaAnterior;
	}

	public void setCaixaAnterior(Caixa caixaAnterior) {
		this.caixaAnterior = caixaAnterior;
	}

	public BigDecimal getSaldoAtual() {
		return saldoAtual;
	}

	public void setSaldoAtual(BigDecimal saldoAtual) {
		this.saldoAtual = saldoAtual;
	}

	public Caixa getCaixa() {
		return caixa;
	}

	public void setCaixa(Caixa caixa) {
		this.caixa = caixa;
	}

}
